package com.la.yuer.prc.io.chinnel;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

public class NIOServer {
    public static void main2(String[] args) throws IOException, InterruptedException {
        //第一步 打开通道
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        //第二步：绑定端口号
        serverSocketChannel.bind(new InetSocketAddress(9999));
        //第三步： 通道默认是阻塞的，需要设置非阻塞
        serverSocketChannel.configureBlocking(false);

        System.out.println("服务端启动成功");
        while (true){
            //第四步：检查客户端是否有链接，如果有客户端的链接，则返回相对应的通道
            SocketChannel socketChannel = serverSocketChannel.accept();
            if(socketChannel == null){
                System.out.println("没有客户端链接....,要去泡妞了");
                Thread.sleep(1000);
            }
            //第五步： 客户端有链接，读取数据，兵吧数据放入到Bytebutter这个缓冲区中
            ByteBuffer allocate = ByteBuffer.allocate(1024);

            int read = socketChannel.read(allocate);
            // 返回值的读取 整数表示读到了数据返回有效字节数，0 ：表示本次没有读到
            System.out.println("客户端消息："+new String(allocate.array(),0,read,
                    StandardCharsets.UTF_8));
            //第6步：给客户端写入消息
            socketChannel.write(ByteBuffer.wrap("反正我没钱".getBytes(StandardCharsets.UTF_8)));
            //第七步：释放资源换
            socketChannel.close();
            allocate.clear();
        }
    }
    public static void main(String[] args) throws Exception {
        ServerSocketChannel serverSocketChannel =null;
        SocketChannel socketChannel =null;
//        try {
            //第一步 打开通道
            serverSocketChannel = ServerSocketChannel.open();
            // 第二步 设置对应的端口号
            serverSocketChannel.bind(new InetSocketAddress(9999));
            // 通道默认是阻塞的，需要设置非阻塞
            serverSocketChannel.configureBlocking(false);

            //第三部：绑定端口号
            System.out.println("服务端启动成功");
            while (true){
                //第四部 检查客户端是否有链接，如果有客户端的链接，则返回相对应的通道
                socketChannel = serverSocketChannel.accept();
                if(socketChannel == null){
                System.out.println("没有客户端链接....,要去泡妞了");
                    Thread.sleep(1000);
                    continue;
                }
                // 客户端有链接，读取数据，兵吧数据放入到Bytebutter这个缓冲区中
                ByteBuffer allocate = ByteBuffer.allocate(1024);

                int read = socketChannel.read(allocate);
                // 返回值的读取 整数表示读到了数据返回有效字节数，0 ：表示本次没有读到
                System.out.println("客户端消息："+new String(allocate.array(),0,read,
                        StandardCharsets.UTF_8));
                //给客户端写入消息
                socketChannel.write(ByteBuffer.wrap("反正我没钱".getBytes(StandardCharsets.UTF_8)));
                allocate.clear();
                if(socketChannel != null){
                    //第七步：释放资源换
                    try {
                        socketChannel.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
    }
}
